// CenterFile.h
//edit by xavier
//2011.10.18
//version 1.0.0

#pragma once

#ifndef CENTER_H_
#define CENTER_H_

namespace Center_Extract {
#pragma pack(push,1)

enum LOAD_TYPE {
	FIRST_LOAD = 0x001, INCREMENT_LOAD = 0x002
};
enum FEATURE_TYPE {
	SHAPE = 0x002, TOPOLOGY = 0x004
};


struct strClusterCenterInfo {
	int ClassID; //类目号
	int center_dim; //聚类中心维度
	int center_num; //聚类中心个数
	float **center_data; //聚类中心数据 center_dim * center_num个float
};

struct strAllClusterDataInfo {
	strClusterCenterInfo* sClassCenterInfoList;//
	int nAllClassNum; //类目数
	int nCenterDim; //聚类中心维度
};
/*
 * loadAllClasses
 * @Brief 加载全部类目聚类中心，包括默认聚类中心
 * @param [IN] center_path:聚类中心文件路径，需要以/结尾
 * @param [OUT] dataout:输出文件，存储聚类中心数据
 * @return int 0：正常 其他：异常
 */
int loadAllClasses(char* center_path, strAllClusterDataInfo* dataout);


/*
 * initialForWrite
 * @Brief 初始化写聚类中心
 * @param [IN] center_path:聚类中心文件路径，需要以/结尾
 * @param [OUT] dataout:输出文件，存储聚类中心数据
 * @return int 0：正常 其他：异常
 */
int initialForWrite(char* center_path, strAllClusterDataInfo* dataout);

/*
 * appendOneClass
 * @Brief 增加一个类目聚类中心数据
 * @param [IN] dataout:存储聚类中心数据
 * @param [IN] cluster_center_info:要添加的类目的聚类中心数据
 * @return int 0：正常 其他：异常
 */
int appendOneClass(strAllClusterDataInfo* dataout,
		strClusterCenterInfo* cluster_center_info);


/*
 * appendDefault
 * @Brief 增加默认聚类中心数据
 * @param [IN] dataout:存储聚类中心数据
 * @param [IN] default_center_path:要添加的默认聚类中心数据文件路径及文件名
 * @param [IN] default_cluster_count:默认聚类中心个数
 * @return int 0：正常 其他：异常
 */
int appendDefault(strAllClusterDataInfo* dataout, char* default_center_path,
		int default_cluster_count);

/*
 * saveCenterFile
 * @Brief 将聚类中心数据写到磁盘文件
 * @param [IN] center_path:聚类中心文件路径，需要以/结尾
 * @param [IN] dataout:存储聚类中心数据
 * @return int 0：正常 其他：异常
 */
int saveCenterFile(char* center_path, strAllClusterDataInfo* dataout);


/*
 * freeStrAllClusterDataInfo
 * @Brief 释放StrAllClusterDataInfo内存
 * @param [IN] dataout:要释放的StrAllClusterDataInfo指针
 * @return int 0：正常 其他：异常
 */
int freeStrAllClusterDataInfo(strAllClusterDataInfo* dataout);


/*
 * freeStrAllClusterDataInfo
 * @Brief 释放strClusterCenterInfo内存
 * @param [IN] oneclass:要释放的strClusterCenterInfo指针
 * @return int 0：正常 其他：异常
 */
int freestrClusterCenterInfo(strClusterCenterInfo* oneclass);


/*
 * loadOneClass
 * @Brief 加载单个类目聚类中心
 * @param [IN] center_path:聚类中心文件路径，需要以/结尾
 * @param [IN] class_id:大类号
 * @param [IN] sub_class_id:子类号
 * @param [OUT] one_class:输出文件，存储聚类中心数据
 * @return int 0：正常 其他：异常
 */
int loadOneClass(char* center_path,int class_id,int sub_class_id, strClusterCenterInfo* one_class);
}
#pragma pack(pop)
#endif /* CENTER_H_ */
